package com.summer.filesync.security;

import java.util.Map;

/** JWT令牌验证结果类 封装令牌验证的结果信息 */
public class TokenValidationResult {
  private final boolean valid;
  private final String username;
  private final UserRole role;
  private final Map<String, Object> claims;
  private final String errorMessage;

  private TokenValidationResult(
      boolean valid,
      String username,
      UserRole role,
      Map<String, Object> claims,
      String errorMessage) {
    this.valid = valid;
    this.username = username;
    this.role = role;
    this.claims = claims;
    this.errorMessage = errorMessage;
  }

  /**
   * 创建有效的验证结果
   *
   * @param username 用户名
   * @param role 用户角色
   * @param claims JWT声明
   * @return 验证结果
   */
  public static TokenValidationResult valid(
      String username, UserRole role, Map<String, Object> claims) {
    return new TokenValidationResult(true, username, role, claims, null);
  }

  /**
   * 创建无效的验证结果
   *
   * @param errorMessage 错误信息
   * @return 验证结果
   */
  public static TokenValidationResult invalid(String errorMessage) {
    return new TokenValidationResult(false, null, UserRole.ANONYMOUS, null, errorMessage);
  }

  /**
   * 检查令牌是否有效
   *
   * @return 是否有效
   */
  public boolean isValid() {
    return valid;
  }

  /**
   * 获取用户名
   *
   * @return 用户名，如果令牌无效返回null
   */
  public String getUsername() {
    return username;
  }

  /**
   * 获取用户角色
   *
   * @return 用户角色，如果令牌无效返回ANONYMOUS
   */
  public UserRole getRole() {
    return role != null ? role : UserRole.ANONYMOUS;
  }

  /**
   * 获取JWT声明
   *
   * @return JWT声明映射，如果令牌无效返回null
   */
  public Map<String, Object> getClaims() {
    return claims;
  }

  /**
   * 获取错误信息
   *
   * @return 错误信息，如果令牌有效返回null
   */
  public String getErrorMessage() {
    return errorMessage;
  }

  /**
   * 检查是否有指定权限
   *
   * @param requiredRole 所需角色
   * @return 是否有权限
   */
  public boolean hasPermission(UserRole requiredRole) {
    return valid && getRole().hasPermission(requiredRole);
  }

  /**
   * 检查是否有指定权限级别
   *
   * @param requiredLevel 所需权限级别
   * @return 是否有权限
   */
  public boolean hasPermission(int requiredLevel) {
    return valid && getRole().hasPermission(requiredLevel);
  }

  @Override
  public String toString() {
    if (valid) {
      return String.format(
          "TokenValidationResult{valid=true, username='%s', role=%s}", username, role);
    } else {
      return String.format("TokenValidationResult{valid=false, error='%s'}", errorMessage);
    }
  }
}
